Goal/hypothesis
The goal of this pseudobulk DE analysis was to consider gene
expression differences between healthy and septic subjects in all CD66b+
cells in the dataset. To achieve this, we aggregated RNA-seq counts
across all CD66b+ cells for each subject. The only variable in the
dataset included in the DE model was “sepsis_status”. Sample_status,
sample_label, and sample_time were not considered.
The hypothesis being tested is related to a seahorse assay that shows
that in samples similar to those described above, the respiration rate
of septic subjects was decreased.
Therefore we are looking for gene expression changes in oxidative
metabolism genes.
Data
The scRNA dataset used for this analysis was generated by Jack Leary
j.leary@ufl.edu .
The dataset includes all cell types and has been integrated by
sample. Total cells were filtered for those with >0 expression of
CD66b+.
The input file is named
“MDSC_Seurat_CD66b_Only_Integrated_By_Sample.Rds”
Pseudobulk DE Analysis with DESeq2
For this analysis, RNA expression data were aggregated across all
cells per-sample. The DESeq2 formulat was exp ~ sepsis_status
The two levels of sepsis status are “Healthy” and “Septic”, and the
comparison was made in the direction “Septic relative to Healthy”
(i.e. positive fold-changes mean higher expression in septic
samples).
P-value adjustment was performed using the Benjamini-Hochberg
method.
Download DE analysis results
Download results of Pseudobulk Septic vs. Healthy DE analysis
Volcano plot
Boxplots of significantly (padj < 0.05) DE genes
LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gQW5hbGF5c2lzIChTZXB0aWMgdnMuIEhlYWx0aHkgc3ViamVjdHMpIGluIEh1bWFuIENENjZiKyBjZWxscyIKYXV0aG9yOiAiSGVhdGhlciBLYXRlcyIKZGF0ZTogIjIwMjMtMTAtMDIiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IHBhcGVyCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRvYzogZmFsc2UKICAgIHRvY19kZXB0aDogMwogICAgZGZfcHJpbnQ6IGthYmxlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjb21tZW50ID0gTkEpOyBzZXQuc2VlZCgzMTIpCmBgYAoKYGBge3J9CiMgTGlicmFyaWVzIAojIyBSCmxpYnJhcnkocHVycnIpICAgICAgIyBmdW5jdGlvbmFsIHByb2dyYW1taW5nIApsaWJyYXJ5KGRwbHlyKSAgICAgICMgZGF0YSBtYW5pcHVsYXRpb24KbGlicmFyeShTZXVyYXQpICAgICAjIHNjUk5BLXNlcSB0b29scwpsaWJyYXJ5KERFU2VxMikgICAgICMgYnVsayBERSB0ZXN0aW5nCmxpYnJhcnkoZ2dwbG90MikgICAgIyBwbG90cwpsaWJyYXJ5KGJpb21hUnQpICAgICMgZ2VuZSBuYW1lcyAKbGlicmFyeShwYXRjaHdvcmspICAjIHBsb3QgYWxpZ25tZW50CmBgYAoKYGBge3J9CiMjIyBGdW5jdGlvbiBDb25mbGljdHMKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKcmVuYW1lIDwtIGRwbHlyOjpyZW5hbWUKcmVkdWNlIDwtIHB1cnJyOjpyZWR1Y2UKYGBgCgpgYGB7cn0KIyBIZWxwZXIgRnVuY3Rpb25zIAojIGNvbm5lY3QgdG8gRW5zZW1ibCBkYXRhYmFzZSB3aGlsZSBhbGxvd2luZyBmb3IgY29ubmVjdGlvbiB0aW1lb3V0cwplbnNlbWJsX2Nvbm5lY3QgPC0gZnVuY3Rpb24oZGF0YXNldC51c2UgPSAiaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJ0LnVzZSA9ICJlbnNlbWJsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnRyaWVzID0gMTApIHsKICBtYXJ0IDwtIHRyeShiaW9tYVJ0Ojp1c2VEYXRhc2V0KGRhdGFzZXQudXNlLCBiaW9tYVJ0Ojp1c2VNYXJ0KG1hcnQudXNlKSksIHNpbGVudCA9IFRSVUUpCiAgaSA8LSAxCiAgd2hpbGUgKGluaGVyaXRzKG1hcnQsICJ0cnktZXJyb3IiKSAmJiBpIDw9IG4udHJpZXMpIHsKICAgIG1hcnQgPC0gdHJ5KGJpb21hUnQ6OnVzZURhdGFzZXQoZGF0YXNldC51c2UsIGJpb21hUnQ6OnVzZU1hcnQobWFydC51c2UpKSwgc2lsZW50ID0gVFJVRSkKICAgIGkgPC0gaSArIDEKICB9CiAgaWYgKGluaGVyaXRzKG1hcnQsICJ0cnktZXJyb3IiKSAmJiBpID09IG4udHJpZXMpIHsKICAgIHN0b3AoIk51bWJlciBvZiBjb25uZWN0aW9uIGF0dGVtcHRzIGV4Y2VlZGVkOyBjaGVjayBFbnNlbWJsIGF2YWlsYWJpbGl0eSBhdCB3d3cuZW5zZW1ibC5pbmZvIikKICB9CiAgcmV0dXJuKG1hcnQpCn0KIyByZXRyaWV2ZSBFbnNlbWJsIElEIHRvIEhHTkMgc3ltYm9sIG1hcHBpbmcKZ2V0X2dlbmVfbWFwcGluZyA8LSBmdW5jdGlvbihtYXJ0Lm9iaiA9IE5VTEwsIGVuc2VtYmwuaWRzID0gTlVMTCkgewogICMgY2hlY2sgaW5wdXRzCiAgaWYgKGlzLm51bGwobWFydC5vYmopKSB7IHN0b3AoIlBsZWFzZSBwcm92aWRlIGEgTWFydCBkYXRhYmFzZS4iKSB9CiAgaWYgKGlzLm51bGwoZW5zZW1ibC5pZHMpKSB7IHN0b3AoIlBsZWFzZSBwcm92aWRlIGEgdmVjdG9yIG9mIEVuc2VtYmwgSURzLiIpIH0KICAjIHJ1biBxdWVyeSAmIGZvcm1hdAogIGdlbmVfbWFwcGluZyA8LSBkYXRhLmZyYW1lKEVOU0VNQkxfSUQgPSBlbnNlbWJsLmlkcykKICBxdWVyeV9yZXMgPC0gYmlvbWFSdDo6Z2V0Qk0oZmlsdGVycyA9ICJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBlbnNlbWJsLmlkcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBtYXJ0Lm9iaikgJT4lIAogICAgICAgICAgICAgICBkcGx5cjo6cmVuYW1lKEVOU0VNQkxfSUQgPSBlbnNlbWJsX2dlbmVfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhHTkNfU1lNQk9MID0gaGduY19zeW1ib2wpICU+JSAKICAgICAgICAgICAgICAgZHBseXI6OmRpc3RpbmN0KCkKICBnZW5lX21hcHBpbmcgPC0gZHBseXI6OmxlZnRfam9pbihnZW5lX21hcHBpbmcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3JlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAiRU5TRU1CTF9JRCIpICU+JSAKICAgICAgICAgICAgICAgICAgZHBseXI6Om11dGF0ZShIR05DX1NZTUJPTCA9IGRwbHlyOjppZl9lbHNlKEhHTkNfU1lNQk9MID09ICIiLCBOQV9jaGFyYWN0ZXJfLCBIR05DX1NZTUJPTCkpCiAgcmV0dXJuKGdlbmVfbWFwcGluZykKfQojIGZldGNoIEVuc2VtYmwgSUQgZm9yIGEgZ2l2ZW4gSEdOQyBzeW1ib2wKZ2V0X2Vuc2VtYmwgPC0gZnVuY3Rpb24oZ2VuZS5uYW1lID0gTlVMTCwgZ2VuZS50YWJsZSA9IGdlbmVfaWRfdGFibGUpIHsKICAjIGNoZWNrIGlucHV0cyAKICBpZiAoaXMubnVsbChnZW5lLm5hbWUpKSB7IHN0b3AoIlBsZWFzZSBwcm92aWRlIGFuIEhHTkMgc3ltYm9sIHRvIGNvbnZlcnQuIikgfQogICMgY29udmVydCBIR05DIHN5bWJvbCB0byBFbnNlbWJsIElECiAgZW5zZW1ibF9JRCA8LSBkcGx5cjo6ZmlsdGVyKGdlbmVfaWRfdGFibGUsIEhHTkNfU1lNQk9MID09IGdlbmUubmFtZSkgJT4lIAogICAgICAgICAgICAgICAgZHBseXI6OnB1bGwoRU5TRU1CTF9JRCkKICBpZiAoaW5oZXJpdHMoZW5zZW1ibF9JRCwgImRhdGEuZnJhbWUiKSAmJiBucm93KGVuc2VtYmxfSUQpID09IDApIHsKICAgIHN0b3AoIk5vIG1hdGNoaW5nIEVuc2VtYmwgSURzIHdlcmUgZm91bmQgaW4gdGhlIGdpdmVuIGdlbmUgbWFwcGluZyB0YWJsZS4iKQogIH0gCiAgZW5zZW1ibF9JRCA8LSBhcy5jaGFyYWN0ZXIoZW5zZW1ibF9JRCkKICBpZiAobGVuZ3RoKGVuc2VtYmxfSUQpID09IDApIHsKICAgIHN0b3AoIk5vIG1hdGNoaW5nIEVuc2VtYmwgSURzIHdlcmUgZm91bmQgaW4gdGhlIGdpdmVuIGdlbmUgbWFwcGluZyB0YWJsZS4iKQogIH0KICBpZiAobGVuZ3RoKGVuc2VtYmxfSUQpID4gMSkgewogICAgd2FybmluZygiTXVsdGlwbGUgRW5zZW1ibCBJRHMgbWF0Y2ggdGhlIGdpdmVuIEhHTkMgc3ltYm9sLiIpCiAgfQogIHJldHVybihlbnNlbWJsX0lEKQp9CmBgYAoKIyBHb2FsL2h5cG90aGVzaXMKClRoZSBnb2FsIG9mIHRoaXMgcHNldWRvYnVsayBERSBhbmFseXNpcyB3YXMgdG8gY29uc2lkZXIgZ2VuZSBleHByZXNzaW9uIGRpZmZlcmVuY2VzIGJldHdlZW4gaGVhbHRoeSBhbmQgc2VwdGljIHN1YmplY3RzIGluIGFsbCBDRDY2YisgY2VsbHMgaW4gdGhlIGRhdGFzZXQuIFRvIGFjaGlldmUgdGhpcywgd2UgYWdncmVnYXRlZCBSTkEtc2VxIGNvdW50cyBhY3Jvc3MgYWxsIENENjZiKyBjZWxscyBmb3IgZWFjaCBzdWJqZWN0LiBUaGUgb25seSB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBpbmNsdWRlZCBpbiB0aGUgREUgbW9kZWwgd2FzICJzZXBzaXNfc3RhdHVzIi4gU2FtcGxlX3N0YXR1cywgc2FtcGxlX2xhYmVsLCBhbmQgc2FtcGxlX3RpbWUgd2VyZSBub3QgY29uc2lkZXJlZC4KClRoZSBoeXBvdGhlc2lzIGJlaW5nIHRlc3RlZCBpcyByZWxhdGVkIHRvIGEgc2VhaG9yc2UgYXNzYXkgdGhhdCBzaG93cyB0aGF0IGluIHNhbXBsZXMgc2ltaWxhciB0byB0aG9zZSBkZXNjcmliZWQgYWJvdmUsIHRoZSByZXNwaXJhdGlvbiByYXRlIG9mIHNlcHRpYyBzdWJqZWN0cyB3YXMgZGVjcmVhc2VkLiAKClRoZXJlZm9yZSB3ZSBhcmUgbG9va2luZyBmb3IgZ2VuZSBleHByZXNzaW9uIGNoYW5nZXMgaW4gb3hpZGF0aXZlIG1ldGFib2xpc20gZ2VuZXMuCgojIERhdGEKClRoZSBzY1JOQSBkYXRhc2V0IHVzZWQgZm9yIHRoaXMgYW5hbHlzaXMgd2FzIGdlbmVyYXRlZCBieSBKYWNrIExlYXJ5IDxqLmxlYXJ5QHVmbC5lZHU+LiAKClRoZSBkYXRhc2V0IGluY2x1ZGVzIGFsbCBjZWxsIHR5cGVzIGFuZCBoYXMgYmVlbiBpbnRlZ3JhdGVkIGJ5IHNhbXBsZS4gVG90YWwgY2VsbHMgd2VyZSBmaWx0ZXJlZCBmb3IgdGhvc2Ugd2l0aCA+MCBleHByZXNzaW9uIG9mIENENjZiKy4KClRoZSBpbnB1dCBmaWxlIGlzIG5hbWVkICJNRFNDX1NldXJhdF9DRDY2Yl9Pbmx5X0ludGVncmF0ZWRfQnlfU2FtcGxlLlJkcyIKCmBgYHtyfQpzZXVfaW50X2hteV9zYW1wX2NkNjZiIDwtIHJlYWRSRFMoIk1EU0NfU2V1cmF0X0NENjZiX09ubHlfSW50ZWdyYXRlZF9CeV9TYW1wbGUuUmRzIikKbWFydCA8LSBlbnNlbWJsX2Nvbm5lY3QoKQpnZW5lX2lkX3RhYmxlIDwtIGdldF9nZW5lX21hcHBpbmcobWFydCwgcm93bmFtZXMoc2V1X2ludF9obXlfc2FtcF9jZDY2YikpCmBgYAoKIyBQc2V1ZG9idWxrIERFIEFuYWx5c2lzIHdpdGggYERFU2VxMmAKCkZvciB0aGlzIGFuYWx5c2lzLCBSTkEgZXhwcmVzc2lvbiBkYXRhIHdlcmUgYWdncmVnYXRlZCBhY3Jvc3MgYWxsIGNlbGxzIHBlci1zYW1wbGUuIFRoZSBERVNlcTIgZm9ybXVsYXQgd2FzIGV4cCB+IHNlcHNpc19zdGF0dXMKClRoZSB0d28gbGV2ZWxzIG9mIHNlcHNpcyBzdGF0dXMgYXJlICJIZWFsdGh5IiBhbmQgIlNlcHRpYyIsIGFuZCB0aGUgY29tcGFyaXNvbiB3YXMgbWFkZSBpbiB0aGUgZGlyZWN0aW9uICJTZXB0aWMgcmVsYXRpdmUgdG8gSGVhbHRoeSIgKGkuZS4gcG9zaXRpdmUgZm9sZC1jaGFuZ2VzIG1lYW4gaGlnaGVyIGV4cHJlc3Npb24gaW4gc2VwdGljIHNhbXBsZXMpLgoKUC12YWx1ZSBhZGp1c3RtZW50IHdhcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEJlbmphbWluaS1Ib2NoYmVyZyBtZXRob2QuCgpgYGB7cn0KIyMjIyMgcHNldWRvYnVsayBhZ2dyZWdhdGlvbiBwZXItc2FtcGxlCiNBZ2dyZWdhdGlvbgpwYl9saXN0IDwtIGRhdGEuZnJhbWUoQWdncmVnYXRlRXhwcmVzc2lvbihzZXVfaW50X2hteV9zYW1wX2NkNjZiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5cyA9ICJSTkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAic2FtcGxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90ID0gImNvdW50cyIpKQojRWRpdCBwYl9saXN0IGNvbG5hbWVzCmNvbG5hbWVzKHBiX2xpc3QpIDwtIGdzdWIoIlJOQS4iLCIiLGNvbG5hbWVzKHBiX2xpc3QpKQpjb2xuYW1lcyhwYl9saXN0KSA8LSBnc3ViKCJcXC4iLCItIixjb2xuYW1lcyhwYl9saXN0KSkKCnNhbXBsZV9tZXRhZGF0YSA8LSBkaXN0aW5jdChzZXVfaW50X2hteV9zYW1wX2NkNjZiQG1ldGEuZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3N1YmplY3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2xhYmVsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zdGF0dXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3RpbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vwc2lzX3N0YXR1cykgJT4lIAogICAgICAgICAgICAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmZhY3RvciksIGRyb3BsZXZlbHMpKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgbWFncml0dHI6OnNldF9yb3duYW1lcyguJHNhbXBsZSkKc2FtcGxlX21ldGFkYXRhJHNhbXBsZSA8LSBnc3ViKCJfIiwiLSIsc2FtcGxlX21ldGFkYXRhJHNhbXBsZSkKcm93bmFtZXMoc2FtcGxlX21ldGFkYXRhKSA8LSBnc3ViKCJfIiwiLSIscm93bmFtZXMoc2FtcGxlX21ldGFkYXRhKSkKCmRlc2VxX29iaiA8LSBERVNlcURhdGFTZXRGcm9tTWF0cml4KHBiX2xpc3RbLCBzYW1wbGVfbWV0YWRhdGEkc2FtcGxlXSwgCiAgICAgICAgICAgICBjb2xEYXRhID0gc2FtcGxlX21ldGFkYXRhLCAKICAgICAgICAgICAgIGRlc2lnbiA9IH5zZXBzaXNfc3RhdHVzKQogICAKZGVzZXFfZGUgPC0gREVTZXEoZGVzZXFfb2JqKQoKZGVzZXFfcmVzIDwtIHJlc3VsdHMoZGVzZXFfZGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc3VsdHNOYW1lcyhkZXNlcV9kZSlbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiaG9sbSIpCgpkZXNlcV9yZXNfc2hyaW5rIDwtIGxmY1NocmluayhkZXNlcV9kZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmID0gcmVzdWx0c05hbWVzKGRlc2VxX2RlKVstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJhcGVnbG0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IGRlc2VxX3JlcykKCmRlc2VxX3Jlc19kZiA8LSBhcy5kYXRhLmZyYW1lKGRlc2VxX3Jlc19zaHJpbmspICU+JSAKICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZW5zZW1ibF9pZCA9IHJvd25hbWVzKC4pKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgbGVmdF9qb2luKGdlbmVfaWRfdGFibGUsIGJ5ID0gYygiZW5zZW1ibF9pZCIgPSAiRU5TRU1CTF9JRCIpKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgcmVuYW1lKGdlbmUgPSBIR05DX1NZTUJPTCkgJT4lIAogICAgICAgICAgICAgICAgICAgIHJlbG9jYXRlKGVuc2VtYmxfaWQsIGdlbmUpCmRlc2VxX3Jlc19kZl91bnNocmluayA8LSBhcy5kYXRhLmZyYW1lKGRlc2VxX3JlcykgJT4lIAogICAgICAgICAgICAgICAgICAgIG11dGF0ZShlbnNlbWJsX2lkID0gcm93bmFtZXMoLikpICU+JSAKICAgICAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oZ2VuZV9pZF90YWJsZSwgYnkgPSBjKCJlbnNlbWJsX2lkIiA9ICJFTlNFTUJMX0lEIikpICU+JSAKICAgICAgICAgICAgICAgICAgICByZW5hbWUoZ2VuZSA9IEhHTkNfU1lNQk9MKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGUoZW5zZW1ibF9pZCwgZ2VuZSkKYGBgCgojIERvd25sb2FkIERFIGFuYWx5c2lzIHJlc3VsdHMKCmBgYHtyfQpsaWJyYXJ5KGRvd25sb2FkdGhpcykKZGVzZXFfcmVzX2RmICU+JSAKICBkb3dubG9hZF90aGlzKAogICAgb3V0cHV0X25hbWUgPSAiQ0Q2NmJfUHNldWRvYnVsa19TZXB0aWNfdnNfSGVhbHRoeV9ERSIsCiAgICBvdXRwdXRfZXh0ZW5zaW9uID0gIi54bHN4IiwKICAgIGJ1dHRvbl9sYWJlbCA9ICJEb3dubG9hZCByZXN1bHRzIG9mIFBzZXVkb2J1bGsgU2VwdGljIHZzLiBIZWFsdGh5IERFIGFuYWx5c2lzIiwKICAgIGJ1dHRvbl90eXBlID0gImRlZmF1bHQiLAogICAgaGFzX2ljb24gPSBUUlVFLAogICAgaWNvbiA9ICJmYSBmYS1zYXZlIgogICkKYGBgCgojIFZvbGNhbm8gcGxvdCAKCmBgYHtyLGZpZy5kaW09Yyg2LDgpfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyZXBlbCkKCiMgRXh0cmFjdCBwdmFsdWUsIGxvZzJGb2xkQ2hhbmdlLCBhbmQgZ2VuZSBuYW1lCnZvbGNhbm9fZGF0YSA8LSBkZXNlcV9yZXNfZGZfdW5zaHJpbmsgJT4lCiAgc2VsZWN0KGVuc2VtYmxfaWQsIGdlbmUsIHB2YWx1ZSwgcGFkaiwgbG9nMkZvbGRDaGFuZ2UpICU+JQogIG11dGF0ZShuZWdfbG9nMTBfcHZhbHVlID0gLWxvZzEwKHB2YWx1ZSkpCgpsaWJyYXJ5KEVuaGFuY2VkVm9sY2FubykKCiMgQ3JlYXRlIHZvbGNhbm8gcGxvdCB1c2luZyBFbmhhbmNlZFZvbGNhbm8KcCA8LSBFbmhhbmNlZFZvbGNhbm8oCiAgdm9sY2Fub19kYXRhLAogIGxhYiA9IHZvbGNhbm9fZGF0YSRnZW5lLCAjIFVzZSB0aGUgJ2dlbmUnIGNvbHVtbiBmb3IgbGFiZWxpbmcKICB4ID0gJ2xvZzJGb2xkQ2hhbmdlJywKICB5ID0gJ3B2YWx1ZScsCiAgdGl0bGUgPSAiREUgaW4gU2VwdGljIHZzLiBIZWFsdGh5IiwKIHN1YnRpdGxlID0gInBzZXVkb2J1bGsgc2FtcGxlcyAoQ0Q2NmIrIGNlbGxzKSIsCgogIHhsYWIgPSAiTG9nMiBGb2xkIENoYW5nZSIsICMgQ3VzdG9taXplIHgtYXhpcyBsYWJlbAogIHlsYWIgPSAiLUxvZzEwIFAtdmFsdWUiLCAjIEN1c3RvbWl6ZSB5LWF4aXMgbGFiZWwKICBwQ3V0b2ZmID0gMC4wNSwgIyBTZXQgdGhlIHAtdmFsdWUgY3V0b2ZmIGZvciBzaWduaWZpY2FuY2UKICBGQ2N1dG9mZiA9IDEuMCwgIyBBZGp1c3QgZm9sZCBjaGFuZ2UgY3V0b2ZmIGFzIG5lZWRlZAogIHBvaW50U2l6ZSA9IDEuMCwgIyBDdXN0b21pemUgdGhlIHBvaW50IHNpemUKICBsYWJTaXplID0gMy4wLCAjIEN1c3RvbWl6ZSB0aGUgbGFiZWwgc2l6ZQogIGRyYXdDb25uZWN0b3JzID0gVFJVRSwgIyBEcmF3IGxpbmVzIGNvbm5lY3RpbmcgbGFiZWxzIHRvIHBvaW50cwogIHdpZHRoQ29ubmVjdG9ycyA9IDAuNSwgIyBDdXN0b21pemUgdGhlIHdpZHRoIG9mIGNvbm5lY3RvciBsaW5lcwogIHNlbGVjdExhYiA9IHZvbGNhbm9fZGF0YSAlPiUgCiAgICBhcnJhbmdlKHBhZGopICU+JSAKICAgIGhlYWQoMTIpICU+JSAKICAgIHB1bGwoZ2VuZSkgIyBTZWxlY3QgdGhlIHRvcCAxMiBnZW5lcyB0byBsYWJlbAopCnByaW50KHApCmBgYAoKIyBCb3hwbG90cyBvZiBzaWduaWZpY2FudGx5IChwYWRqIDwgMC4wNSkgREUgZ2VuZXMKCmBgYHtyLGZpZy5kaW09Yyg4LDEyKX0KbGlicmFyeShwYXRjaHdvcmspCnJsb2dfY291bnRzIDwtIHJsb2coZGVzZXFfb2JqLCBibGluZCA9IEZBTFNFKQp0cmFuc2Zvcm1lZF9jb3VudHMgPC0gYXNzYXkocmxvZ19jb3VudHMpICAjIFVzZSB2c3RfY291bnRzIGZvciBWU1QKc2lnbmlmaWNhbnRfZ2VuZXMgPC0gZGVzZXFfcmVzX2RmICU+JSBmaWx0ZXIocGFkaiA8IDAuMDUpICU+JSAuJGVuc2VtYmxfaWQKCiMgQXNzdW1pbmcgJ3BiX2xpc3QnIGlzIHlvdXIgcHNldWRvYnVsayBleHByZXNzaW9uIG1hdHJpeApkZl9sb25nIDwtIGFzLmRhdGEuZnJhbWUodCh0cmFuc2Zvcm1lZF9jb3VudHNbc2lnbmlmaWNhbnRfZ2VuZXMsIF0pKQpkZl9sb25nJHNhbXBsZSA8LSByb3duYW1lcyhkZl9sb25nKQoKIyBNZXJnaW5nIHdpdGggc2FtcGxlIG1ldGFkYXRhIHRvIGdldCBzZXBzaXMgc3RhdHVzCmRmX2xvbmcgPC0gbWVyZ2UoZGZfbG9uZywgc2FtcGxlX21ldGFkYXRhLCBieSA9ICJzYW1wbGUiLCBhbGwueCA9IFRSVUUpCgojIENyZWF0ZSBsaXN0IG9mIGJveHBsb3RzCnBsb3RfbGlzdCA8LSBsaXN0KCkKZm9yIChlbnNlbWJsX2lkIGluIHNpZ25pZmljYW50X2dlbmVzKSB7CiAgZ2VuZV9uYW1lIDwtIGRlc2VxX3Jlc19kZltkZXNlcV9yZXNfZGYkZW5zZW1ibF9pZCA9PSBlbnNlbWJsX2lkLCAiZ2VuZSJdCiAgCiAgcCA8LSBnZ3Bsb3QoZGZfbG9uZywgYWVzKHggPSBzZXBzaXNfc3RhdHVzLCB5ID0gISFzeW0oZW5zZW1ibF9pZCksIGZpbGwgPSBzZXBzaXNfc3RhdHVzKSkgKwogICAgICAgZ2VvbV9ib3hwbG90KCkgKwogICAgICAgbGFicyh0aXRsZSA9IGdlbmVfbmFtZSwgeCA9ICIiLCB5ID0gIk5vcm1hbGl6ZWQgRXhwcmVzc2lvbiIpICsKICAgICAgIHRoZW1lX21pbmltYWwoKSArCiAgICAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCiAgcGxvdF9saXN0W1tnZW5lX25hbWVdXSA8LSBwCn0KCiMgRGV0ZXJtaW5lIHRoZSBncmlkIGxheW91dApudW1fcGxvdHMgPC0gbGVuZ3RoKHBsb3RfbGlzdCkKbnVtX2NvbHMgPC0gNApudW1fcm93cyA8LSBjZWlsaW5nKG51bV9wbG90cyAvIG51bV9jb2xzKQoKIyBDb21iaW5lIGFsbCBwbG90cyBpbnRvIGEgZ3JpZApjb21iaW5lZF9wbG90IDwtIHdyYXBfcGxvdHMocGxvdF9saXN0LCBuY29sID0gbnVtX2NvbHMpICsKICAgICAgICAgICAgICAgICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiQm94cGxvdHMgb2YgU2lnbmlmaWNhbnRseSBERSBHZW5lcyBieSBTZXBzaXMgU3RhdHVzIikKCiMgUHJpbnQgdGhlIGNvbWJpbmVkIHBsb3QKcHJpbnQoY29tYmluZWRfcGxvdCkKYGBgCgojIEdlbmUgZXhwcmVzc2lvbiBjaGFuZ2VzIChTZXB0aWMgdnMuIEhlYWx0aHkpIGluIE94aWRhdGl2ZSBNZXRhYm9saXNtIGdlbmVzCgpDbGF5IE1hdGhld3MgPGNsYXl0b24ubWF0aGV3c0BwYXRob2xvZ3kudWZsLmVkdT4gc2VudCBhIGxpc3Qgb2YgODk1IGdlbmVzIGludm9sdmVkIGluIG94aWRhdGl2ZSBtZXRhYm9saXNtIHRvIHNlZSBpZiB0aGVyZSBhcmUgZ2VuZSBleHByZXNzaW9uIGRpZmZlcmVuY2VzIGluIENENjZiKyBjZWxscyBiZXR3ZWVuIHNlcHRpYyBhbmQgaGVhbHRoeSBzdWJqZWN0cy4gVGhlcmUgd2VyZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiB0aGVzZSBnZW5lcywgYnV0IGJveHBsb3RzIGZvciB0aGUgdGVuIGdlbmVzIHdpdGggbG93ZXN0IHAtdmFsdWVzIGFyZSBzaG93biwgYW5kIHRoZSBERSByZXN1bHRzIGZvciBqdXN0IHRoZXNlIDg5NSBnZW5lcyBjYW4gYmUgZG93bmxvYWRlZC4KCgpgYGB7cn0KUk0xX2dlbmVzIDwtIHJlYWQuY3N2KCJSTTEvUk0xLU1ldGFib2xpc21fR2VuZV9MaXN0LmNzdiIpClJNMV9yZXN1bHRzIDwtIGRlc2VxX3Jlc19kZiAlPiUgZmlsdGVyKGdlbmUgJWluJSBSTTFfZ2VuZXMkR2VuZS5TeW1ib2wpCmRlc2VxX3Jlc19kZiAlPiUgCiAgZG93bmxvYWRfdGhpcygKICAgIG91dHB1dF9uYW1lID0gIkNENjZiX1BzZXVkb2J1bGtfU2VwdGljX3ZzX0hlYWx0aHlfREVfT3hNZXRfZ2VuZXMiLAogICAgb3V0cHV0X2V4dGVuc2lvbiA9ICIueGxzeCIsCiAgICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgT3hNZXQgZ2VuZXMgc3Vic2V0IGZyb20gcmVzdWx0cyBvZiBQc2V1ZG9idWxrIFNlcHRpYyB2cy4gSGVhbHRoeSBERSBhbmFseXNpcyIsCiAgICBidXR0b25fdHlwZSA9ICJkZWZhdWx0IiwKICAgIGhhc19pY29uID0gVFJVRSwKICAgIGljb24gPSAiZmEgZmEtc2F2ZSIKICApCmBgYAoKIyBCb3hwbG90cyBvZiB0b3AgREUgKG5vdCBzaWduaWZpY2FudDsgdG9wIDEwKSBveGlkYXRpdmUgbWV0YWJvbGlzbSBnZW5lcyAKCmBgYHtyLGZpZy5kaW09Yyg4LDEyKX0KUk0xX3RvcF9nZW5lcyA8LSBSTTFfcmVzdWx0cyAlPiUgYXJyYW5nZSgicHZhbHVlIixuYS5sYXN0PVRSVUUpICU+JSBoZWFkKG49MTApICU+JSAuJGVuc2VtYmxfaWQKCiMgQXNzdW1pbmcgJ3BiX2xpc3QnIGlzIHlvdXIgcHNldWRvYnVsayBleHByZXNzaW9uIG1hdHJpeApSTTFfbG9uZyA8LSBhcy5kYXRhLmZyYW1lKHQodHJhbnNmb3JtZWRfY291bnRzW1JNMV90b3BfZ2VuZXMsIF0pKQpSTTFfbG9uZyRzYW1wbGUgPC0gcm93bmFtZXMoUk0xX2xvbmcpCgojIE1lcmdpbmcgd2l0aCBzYW1wbGUgbWV0YWRhdGEgdG8gZ2V0IHNlcHNpcyBzdGF0dXMKUk0xX2xvbmcgPC0gbWVyZ2UoUk0xX2xvbmcsIHNhbXBsZV9tZXRhZGF0YSwgYnkgPSAic2FtcGxlIiwgYWxsLnggPSBUUlVFKQoKIyBDcmVhdGUgdGhlIGxpc3Qgb2YgYm94cGxvdHMKcGxvdF9saXN0MiA8LSBsaXN0KCkKCmZvciAoZW5zZW1ibF9pZCBpbiBSTTFfdG9wX2dlbmVzKSB7CiAgZ2VuZV9uYW1lIDwtIFJNMV9yZXN1bHRzW1JNMV9yZXN1bHRzJGVuc2VtYmxfaWQgPT0gZW5zZW1ibF9pZCwgImdlbmUiXQogIAogIHAgPC0gZ2dwbG90KFJNMV9sb25nLCBhZXMoeCA9IHNlcHNpc19zdGF0dXMsIHkgPSAhIXN5bShlbnNlbWJsX2lkKSwgZmlsbCA9IHNlcHNpc19zdGF0dXMpKSArCiAgICAgICBnZW9tX2JveHBsb3QoKSArCiAgICAgICBsYWJzKHRpdGxlID0gZ2VuZV9uYW1lLCB4ID0gIlNlcHNpcyBTdGF0dXMiLCB5ID0gIk5vcm1hbGl6ZWQgRXhwcmVzc2lvbiIpICsKICAgICAgIHRoZW1lX21pbmltYWwoKSArCiAgICAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCiAgcGxvdF9saXN0MltbZ2VuZV9uYW1lXV0gPC0gcAp9CgojIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHBsb3RzIGFuZCBsYXlvdXQKbnVtX3Bsb3RzIDwtIGxlbmd0aChwbG90X2xpc3QyKQpudW1fY29scyA8LSA0Cm51bV9yb3dzIDwtIGNlaWxpbmcobnVtX3Bsb3RzIC8gbnVtX2NvbHMpCgojIENvbWJpbmUgYWxsIHBsb3RzIGludG8gYSBncmlkIHVzaW5nIHBhdGNod29yawpjb21iaW5lZF9wbG90MiA8LSB3cmFwX3Bsb3RzKHBsb3RfbGlzdDIsIG5jb2wgPSBudW1fY29scykgKwogICAgICAgICAgICAgICAgICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiQm94cGxvdHMgb2YgVG9wIFJNMSBHZW5lIEV4cHJlc3Npb25zIGJ5IFNlcHNpcyBTdGF0dXMiKQoKIyBQcmludCB0aGUgY29tYmluZWQgcGxvdApwcmludChjb21iaW5lZF9wbG90MikKYGBgCgpgYGB7cn0KIyBDdXN0b20gZnVuY3Rpb24gdG8gcHJpbnQgcmVsZXZhbnQgc2Vzc2lvbiBpbmZvCnByaW50X3JlbGV2YW50X3Nlc3Npb25faW5mbyA8LSBmdW5jdGlvbigpIHsKICBzaSA8LSBzZXNzaW9uSW5mbygpCiAgCiAgIyBSIHZlcnNpb24KICBjYXQoIlIgdmVyc2lvbjoiLCBzaSRSLnZlcnNpb24kdmVyc2lvbi5zdHJpbmcsICJcbiIpCiAgCiAgIyBEaXJlY3RseSBsb2FkZWQgcGFja2FnZXMgKG90aGVyIGF0dGFjaGVkIHBhY2thZ2VzKQogIGNhdCgiXG5EaXJlY3RseSBsb2FkZWQgcGFja2FnZXM6XG4iKQogIGZvciAocGtnIGluIHNpJG90aGVyUGtncykgewogICAgY2F0KHBrZyRQYWNrYWdlLCAidmVyc2lvbiIsIHBrZyRWZXJzaW9uLCAiXG4iKQogIH0KfQoKIyBVc2UgdGhlIGZ1bmN0aW9uCnByaW50X3JlbGV2YW50X3Nlc3Npb25faW5mbygpCgpgYGAKCgo=